package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 套餐管理
 */
@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {
	@Autowired
	private SetmealService setmealService;
	@Autowired
	private SetmealDishService setmealDishService;
	@Autowired
	private CategoryService categoryService;
	@PostMapping
	public R<String> save(@RequestBody SetmealDto setmealDto){
		log.info("套餐信息：{}",setmealDto);

		setmealService.saveWithDish(setmealDto);

		return R.success("新增套餐成功");
	}
	/**
	 * 套餐分页查询
	 * @param page
	 * @param pageSize
	 * @param name
	 * @return
	 */
	@GetMapping("/page")
	public R<Page> page(int page,int pageSize,String name){
		//分页构造器对象
		Page<Setmeal> pageInfo = new Page<>(page,pageSize);
		Page<SetmealDto> dtoPage = new Page<>();

		LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
		//添加查询条件，根据name进行like模糊查询
		queryWrapper.like(name != null,Setmeal::getName,name);
		//添加排序条件，根据更新时间降序排列
		queryWrapper.orderByDesc(Setmeal::getUpdateTime);

		setmealService.page(pageInfo,queryWrapper);

		//对象拷贝
		BeanUtils.copyProperties(pageInfo,dtoPage,"records");
		List<Setmeal> records = pageInfo.getRecords();

		List<SetmealDto> list = records.stream().map((item) -> {
			SetmealDto setmealDto = new SetmealDto();
			//对象拷贝
			BeanUtils.copyProperties(item,setmealDto);
			//分类id
			Long categoryId = item.getCategoryId();
			//根据分类id查询分类对象
			Category category = categoryService.getById(categoryId);
			if(category != null){
				//分类名称
				String categoryName = category.getName();
				setmealDto.setCategoryName(categoryName);
			}
			return setmealDto;
		}).collect(Collectors.toList());

		dtoPage.setRecords(list);
		return R.success(dtoPage);
	}

	/**
	 * 删除套餐
	 * @param ids
	 * @return
	 */
	@DeleteMapping
	public R<String> delete(@RequestParam List<Long> ids){
		setmealService.removeWithDish(ids);
		return R.success("套餐数据删除成功");
	}

	/**
	 * 批量起售停售
	 */
	@PostMapping("/status/{statusNum}")
	public R<String>  updateSetmeal(@PathVariable Integer statusNum, @RequestParam List<Long> ids){
		LambdaUpdateWrapper<Setmeal> updateWrapper = new LambdaUpdateWrapper<>();
		updateWrapper.in(Setmeal::getId,ids);
		updateWrapper.set(Setmeal::getStatus,statusNum);
		setmealService.update(updateWrapper);
		return R.success("套餐状态改变成功");

	}
	/**
	 * 根据id查询套餐信息
	 *(套餐信息的回显)
	 * @param id
	 * @return
	 */
	@GetMapping("/{id}")
	public R<SetmealDto> getById(@PathVariable Long id) {
		log.info("根据id查询套餐信息:{}", id);
		// 调用service执行查询。、
		SetmealDto setmealDto = setmealService.getByIdWithDish(id);
		return R.success(setmealDto);
	}
	/**
	 * 修改套餐信息。
	 *
	 * @param setmealDto
	 * @return
	 */
	@PutMapping
	public R<String> update(@RequestBody SetmealDto setmealDto) {
		log.info("修改套餐信息{}", setmealDto);
		// 执行更新。
		setmealService.updateWithDish(setmealDto);
		return R.success("修改套餐信息成功");
	}
	/**
	 * 根据条件查询套餐数据
	 * @param setmeal
	 * @return
	 */
	@GetMapping("/list")
	public R<List<Setmeal>> list(Setmeal setmeal){
		LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(setmeal.getCategoryId() != null,Setmeal::getCategoryId,setmeal.getCategoryId());
		queryWrapper.eq(setmeal.getStatus() != null,Setmeal::getStatus,setmeal.getStatus());
		queryWrapper.orderByDesc(Setmeal::getUpdateTime);

		List<Setmeal> list = setmealService.list(queryWrapper);
		return R.success(list);
	}


}
